なにも作らないTerraform moduleを紹介します
ちょっと変わったTerraform moduleを見つけたのでご紹介します。terraform-aws-labelです。
概要
このモジュールは何もリソースをプロビジョニングしません。 モジュール利用者が使うのはモジュールのアウトプットです。
このモジュールは名前の通り、ラベル、あとタグを提供します。このモジュールの用途は一貫したリソース命名やタグ付与の実現です。
使ってみた
以下のようにモジュールを呼んでみます。
data "aws_caller_identity" "current" {} module "labels" { source = "github.com/aws-ia/terraform-aws-label?ref=v0.0.5" account = data.aws_caller_identity.current.account_id env = "dev" name = "sample" namespace = "cm" }
モジュールのアウトプットを確認してみましょう。
% terraform console > module.labels { "account" = "012345678901" "env" = "dev" "id" = "cm-012345678901-dev-sample" "name" = "sample" "namespace" = "cm" "tags" = [ { "key" = "account" "value" = "012345678901" }, { "key" = "env" "value" = "dev" }, { "key" = "name" "value" = "sample" }, { "key" = "namespace" "value" = "cm" }, ] "tags_aws" = { "account" = "012345678901" "env" = "dev" "name" = "sample" "namespace" = "cm" } }
id(ラベル)
出力されたアウトプットのうち、id
に注目です。モジュールに与えたattributesを素に、それっぽい文字列が出来上がっています。あとはこの値をリソース作成時の命名にて参照しましょう。
resource "aws_s3_bucket" "sample" { bucket = "${module.labels.id}-bucket" } resource "aws_security_group" "sample" { name = "${module.labels.id}-sg" }
id値を変えてみる
デフォルトではid値は上記のように
"${namespace}-${account}-${env}-${name}"
になります。これは変更可能です。id_order
attributeを指定します。例えば弊社城岸がおすすめするAWSリソースの命名規則を使うのであればこんな感じですね。
data "aws_caller_identity" "current" {} module "labels" { source = "github.com/aws-ia/terraform-aws-label?ref=v0.0.5" id_order = ["name", "env"] name = "systema" env = "dev" } resource "aws_s3_bucket" "sample" { bucket = "${module.labels.id}-alblog-${data.aws_caller_identity.current.account_id}" } resource "aws_security_group" "sample" { name = "${module.labels.id}-app-sg" }
タグ
このモジュールをタグ付与に使いたい場合はアウトプットの tags
やtags_aws
を使いましょう。
AWS provider
AWS Providerでプロビジョニングするリソースにタグを付与したい場合は、tags_aws
を使います。
resource "aws_s3_bucket" "samole" { bucket = "${module.labels.id}-alblog-${data.aws_caller_identity.current.account_id}" tags = module.labels.tags_aws } resource "aws_security_group" "samole" { name = "${module.labels.id}-app-sg" tags = module.labels.tags_aws }
全リソースに付与する方針であればdefault tagsを使うのが良いでしょう。
provider "aws" { region = "ap-northeast-1" default_tags { tags = module.labels.tags_aws } }
awscc provider
awscc providerはクラウドコントロールAPI用のproviderです。このproviderを使う場合はtags
を使います。
resource "awscc_s3_bucket" "sample" { bucket_name = "${module.labels.id}-awscc-${data.aws_caller_identity.current.account_id}" tags = module.labels.tags }
まとめ
Terraformのterraform-aws-label モジュールを紹介しました。一貫した命名、タグ付けをしたい場合は採用するのもありかと思います。